from pyramid.response import Response
from pyramid.view import view_config

from sqlalchemy.exc import DBAPIError

import math
from operator import itemgetter

import formencode
import json

from pyramid.view import view_config
from pyramid.url import route_url
from pyramid.renderers import render
from pyramid.httpexceptions import HTTPMovedPermanently
from pyramid.httpexceptions import HTTPFound
from pyramid.httpexceptions import HTTPNotFound
from pyramid.security import authenticated_userid
from pyramid.security import remember
from pyramid.security import forget

from pdm.models import DBSession
from pdm.models import User
from pdm.models import Rol
from pdm.models import Proyecto
from pdm.models import Permiso


@view_config(permission='view', route_name='login', renderer='templates/login.pt')
def home_view(request):
	"""
		Llama a la interfaz de logueo, donde el usuario debera ingresar su 
		usuario y contrasenha
	"""
#	logged_in = authenticated_userid(request)
#	print '\n'
#	print 'entre en el home'
#	print logged_in
	return {
	}


@view_config(permission='view', route_name='login_views', renderer = "json")
def login_view(request):
	"""
		Recibe lo ingresado en la interfaz de logueo, validando los datos.
		Si todo esta bien devuelve True, caso contrario False
	"""
	author_username = authenticated_userid(request)
	post_data = request.POST
	username = post_data['username']
	if 'submit' in post_data:
		username = post_data['username']
		password = post_data['password']

        if User.check_password(username, password):
        	print '\n\n'
        	print 'Entre en la comprobacion de usuario contrasenha'
        	headers = remember(request, username)
        	
        	return HTTPFound(location=request.route_url('index'), headers=headers)
        	return {'success' : True}
				
	return {'failure' : True}


@view_config(permission='view', route_name='recuperar_contrasenha', renderer='templates/recuperar_contrasenha.pt')
def pt_recuperar__contrasenha_view(request):
	"""
		Llama a la interfaz de recuperacion de contrasenha, donde el usuario debera 
		ingresar su email
	"""
	return {
	}	
	
@view_config(permission='view', route_name='recuperar_contrasenha_views', renderer = "json")
def recuperar_contrasenha_view(request):
	"""
		Recibe lo ingresado en la interfaz de recuperacion de contrasenha, validando 
		los datos. Si todo esta bien devuelve True, caso contrario False
	"""
	post_data=request.POST
	print '\n\n'
	print post_data['email']
	if User.existe_email(post_data['email']):	
		return {'success' : True}
	return {'success' : False}

@view_config( route_name='logout')
def logout_view(request):
	"""
		Desloguea al usuario que se logueo
	"""
	request.session.invalidate()
	headers = forget(request)
	return HTTPFound(location = request.route_url('login'), headers = headers)


@view_config( route_name='index',
             renderer='templates/index.pt')
def index_view(request):
	"""
		Llama a la interfaz de inicio del sistema, muestra el menu de opciones.
	"""
	logged_in = authenticated_userid(request)
	print '\n'
	print 'entre en el index nuevooooooooooooooo'
	print logged_in	
	return {
		"logged_in":logged_in,
	}	


#################################################################################
#############################   Usuarios   ######################################
#################################################################################
@view_config( route_name='administracion_usuario',
             renderer='templates/usuarios/administracion_usuario.pt')
def administracion_usuario_view(request):
	"""
		Llama a la interfaz de administracion de usuario.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}	
	
	
@view_config( route_name='administracion_usuario_listar',
             renderer='templates/usuarios/administracion_usuario_listar.pt')
def administracion_usuario_listar_view(request):
	"""
		Llama a la interfaz de administracion de usuario, opcion listar.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}		


@view_config( route_name='administracion_usuario_agregar',
             renderer='templates/usuarios/administracion_usuario_agregar.pt')
def administracion_usuario_agregar_view(request):
	"""
		Llama a la interfaz de administracion de usuario, opcion agregar.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}	
	
	
@view_config(route_name='agregar_usuario', renderer='json')
def agregar_usuario_view(request):
	"""
		Agrega un usuario a la base de datos. Devuelve True si fue almacenado, o 
		False en caso contrario
	"""
	post_data = request.POST	
	password1 = post_data['password']
	password2 = post_data['confirmar_password']
	
	if password1 == password2:	
		if 'submit' in post_data:
			session = DBSession()
			user = User(
				username=post_data['usuario'],
				password=post_data['password'],
				name=post_data['nombre_usuario'],
				apellido=post_data['apellido'],
				telefono=post_data['telefono'],
				email=post_data['email']
			)
			session.add(user)
			return {'success' : True}

	return {'failure' : True}  
		

@view_config(route_name='listar_usuario', renderer='json')
def listar_usuario_view(request):	
	"""
		Lista todos los usuarios que estan en la base de datos
	"""
	lista_usuarios =	User.get_all_user()
	vector_diccionario_usuario = []
	for usuario in lista_usuarios:
		diccionario_usuario = {
			'user_id': usuario.user_id,			
			'username': usuario.username,
			'name': usuario.name,			
			'apellido': usuario.apellido,
			'email': usuario.email,
			'telefono': usuario.telefono,
			'creado': str(usuario.creado),
			'vector':[1,2]
		}
		vector_diccionario_usuario.append(diccionario_usuario)
	
	root={'success:':True, 'usuarios': vector_diccionario_usuario}

	return root      
	

@view_config(route_name='eliminar_usuario', renderer='json')
def delete_usuario_view(request):
	"""
		Elimina de la base de datos un usuario. Devuelve True si fue hecha la accion.
	"""
	post_data = request.POST
	User.eliminar_user(post_data['user_id'])
	return {'success:':True}	

@view_config(route_name='modificar_usuario', renderer='json')	
def modificar_usuario_view(request):
	"""
		Modifica de la base de datos un usuario. Devuelve True si fue hecha la accion.
	"""
	post_data = request.POST
	User.modificar_user(post_data['user_id'], post_data['username'], post_data['name'],
						 post_data['apellido'], post_data['email'])
	return {'success':True}	
	
	
	
		
@view_config(route_name='relacion_usuario_rol_asignar', renderer='json')
def relacion_usuario_rol_asignar_view(request):
	print "entre a relaciones_usuario_rol_asignar"
	print "\n\n"
	post_data = request.POST
	
	print post_data['user_id']
	lista_roles=[]
	lista_roles = post_data['lista_roles']

	decoded_data = json.loads(lista_roles)
	print lista_roles
#	print decoded_data[1]
#	print decoded_data[2]
#	print lista_usuarios1[3]
#	print lista_usuarios1[4]

	print "\n"

	return {'success:':True}	
	
	
	
@view_config(route_name='relacion_usuario_rol_desasignar', renderer='json')
def relacion_usuario_rol_desasignar_view(request):
	print "entre a relaciones_usuario_rol"
	print "\n\n"
	post_data = request.POST
	
	print post_data['user_id']
	lista_roles=[]
	lista_roles = post_data['lista_roles']

	
	print lista_roles
#	print lista_usuarios1[1]
#	print lista_usuarios1[2]
#	print lista_usuarios1[3]
#	print lista_usuarios1[4]

	print "\n"

	return {'success:':True}
	

@view_config(route_name='listar_roles_usuario_asignado', renderer='json')
def listar_roles_usuario_asignado_view(request):	
	"""
		Lista todos los roles del sistema con referencia a un usuario.
	"""
	post_data = request.POST
	print '\n\n'
	print 'Impresion de user_id para filtar roles relacionados con el'
	print post_data['user_id']
	print '\n\n'
	print '\n\n'
	lista_rol =	Rol.get_all_rol()
	vector_diccionario_rol = []
	for rol in lista_rol:		
		diccionario_rol = {
			'id_rol': rol.id_rol,			
			'nombre_rol': rol.nombre_rol,
			'descripcion': rol.descripcion,						
			'creado': str(rol.creado),			
		}
		vector_diccionario_rol.append(diccionario_rol)
	
	root={'success:':True, 'rols': vector_diccionario_rol}

	return root 	
	
	
	
@view_config(route_name='listar_roles_usuario_desasignado', renderer='json')
def listar_roles_usuario_desasignado_view(request):	
	"""
		Lista todos los roles del sistema con referencia a un usuario.
	"""
	post_data = request.POST
	print '\n\n'
	print 'Impresion de user_id para filtar roles relacionados con el'
	print post_data['user_id']
	print '\n\n'
	print '\n\n'
	lista_rol =	Rol.get_all_rol()
	vector_diccionario_rol = []
	for rol in lista_rol:		
		diccionario_rol = {
			'id_rol': rol.id_rol,			
			'nombre_rol': rol.nombre_rol,
			'descripcion': rol.descripcion,						
			'creado': str(rol.creado),			
		}
		vector_diccionario_rol.append(diccionario_rol)
	
	root={'success:':True, 'rols': vector_diccionario_rol}

	return root 
#################################################################################
#############################   Rol       #######################################
#################################################################################
@view_config( route_name='administracion_rol',
             renderer='templates/rol/administracion_rol.pt')
def administracion_rol_view(request):
	"""
		Llama a la interfaz de administracion de roles.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}		


	
@view_config( route_name='administracion_rol_listar',
             renderer='templates/rol/administracion_rol_listar.pt')
def administracion_rol_listar_view(request):
	"""
		Llama a la interfaz de administracion de roles, opcion listar.
	"""	
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}		


@view_config( route_name='administracion_rol_agregar',
             renderer='templates/rol/administracion_rol_agregar.pt')
def administracion_rol_agregar_view(request):
	"""
		Llama a la interfaz de administracion de roles, opcion agregar.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}	


@view_config(route_name='agregar_rol', renderer='json')
def agregar_rol_view(request):
	"""
		Agregar un rol a la base de datos. Devuelve True si se relaizo con exito
	"""
	post_data = request.POST
	print'\n\n'
	print post_data['nombre_rol']
	print post_data['descripcion']
	print post_data['tipo']
	print post_data['lista_permisos']
#	print post_data['valor1']
#	print post_data['valor2']
#	if 'submit' in post_data:
#		session = DBSession()
#		rol = Rol(
#			nombre_rol=post_data['nombre_rol'],				
#			descripcion=post_data['descripcion']
#		)
#		session.add(rol)
	return {'success' : True}
#	return {'failure' : True}  
	

@view_config(route_name='listar_rol', renderer='json')
def listar_rol_view(request):	
	"""
		Lista todos los roles del sistema con referencia a un usuario.
	"""
	post_data = request.POST

	lista_rol =	Rol.get_all_rol()
	vector_diccionario_rol = []
	for rol in lista_rol:		
		diccionario_rol = {
			'id_rol': rol.id_rol,			
			'nombre_rol': rol.nombre_rol,
			'descripcion': rol.descripcion,						
			'creado': str(rol.creado),			
		}
		vector_diccionario_rol.append(diccionario_rol)
	
	root={'success:':True, 'rols': vector_diccionario_rol}

	return root      

@view_config(route_name='eliminar_rol', renderer='json')
def eliminar_rol_view(request):
	"""
		Elimina de la base de datos un rol. Devuelve True si fue hecha la accion.
	"""
	post_data = request.POST	
	Rol.eliminar_rol(post_data['id_rol'])		
	return {'success:':True}	
	


@view_config(route_name='modificar_rol', renderer='json')
def modificar_rol_view(request):
	"""
		Modifica de la base de datos un rol. Devuelve True si fue hecha la accion.
	"""
	post_data = request.POST
	Rol.modificar_rol(post_data['id_rol'], post_data['nombre_rol'], post_data['descripcion'])
	return {'success':True}	
	
	
@view_config(route_name='relacion_rol_usuario_asignar', renderer='json')
def relacion_rol_usuario_asignar_view(request):
	print "entre a relaciones_usuario_rol_asignar"
	print "\n\n"
	post_data = request.POST
	
	print post_data['id_rol']
	lista_usuarios1=[]
	lista_usuarios1 = post_data['lista_usuarios']

	decoded_data = json.loads(lista_usuarios1)
	print lista_usuarios1
#	print decoded_data[1]
#	print decoded_data[2]
#	print lista_usuarios1[3]
#	print lista_usuarios1[4]

	print "\n"

	return {'success:':True}	
	
	
	
@view_config(route_name='relacion_rol_usuario_desasignar', renderer='json')
def relacion_rol_usuario_desasignar_view(request):
	print "entre a relaciones_usuario_rol"
	print "\n\n"
	post_data = request.POST
	
	print post_data['id_rol']
	lista_usuarios1=[]
	lista_usuarios1 = post_data['lista_usuarios']

	
	print lista_usuarios1
#	print lista_usuarios1[1]
#	print lista_usuarios1[2]
#	print lista_usuarios1[3]
#	print lista_usuarios1[4]

	print "\n"

	return {'success:':True}			
	


@view_config(route_name='usuario_rol_permiso', renderer='json')
def usuario_rol_permiso_view(request):
	vector_diccionario_rol = []
	diccionario_permisos = {
			'administrar': 1,			
			'eliminar': 1,
			'modificar': 1,						
		}

	root={'success:':True, 'permiso': diccionario_permisos}
	return root

#################################################################################
#############################   Permisos  #######################################
#################################################################################

@view_config(route_name='listar_permisos', renderer='json')
def rol_permisos_relacion_view(request):	
	"""
		Listar los permisos segun la bandera SI, PR, FA y TI.
	"""
	post_data = request.POST
	
	print '\n\n'
	print post_data['tipo']
	print '\n\n'

	lista_permisos = Permiso.get_all_permiso()
	vector_diccionario_permiso = []
	for permiso in lista_permisos:		
		diccionario_permisos = {
			'id_permiso': permiso.id_permiso,			
			'nombre_rol': permiso.nombre_permiso,
			'descripcion': permiso.descripcion,						
			'tipo': permiso.tipo,			
		}
		vector_diccionario_permiso.append(diccionario_permisos)
	
	root={'success:':True, 'permisos': vector_diccionario_permiso}

	return root      

#################################################################################
#############################   Proyecto  #######################################
#################################################################################	
@view_config( route_name='administracion_proyecto',
             renderer='templates/proyecto/administracion_proyecto.pt')
def administracion_proyecto_view(request):
	"""
		Llama a la interfaz de administracion de proyectos.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}		
	
	
@view_config( route_name='administracion_proyecto_listar',
             renderer='templates/proyecto/administracion_proyecto_listar.pt')
def administracion_proyecto_listar_view(request):
	"""
		Llama a la interfaz de administracion de proyectos, opcion listar.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}		


@view_config( route_name='administracion_proyecto_crear',
             renderer='templates/proyecto/administracion_proyecto_crear.pt')
def administracion_proyecto_crear_view(request):
	"""
		Llama a la interfaz de administracion de proyectos, opcion agregar.
	"""
	logged_in = authenticated_userid(request)
	return {
		"logged_in":logged_in,
	}	
	
	
@view_config(route_name='agregar_proyecto', renderer='json')
def agregar_proyecto_view(request):
	post_data = request.POST
	
	
	if 'submit' in post_data:
		session = DBSession()
		proyecto = Proyecto(
			nombre=post_data['nombre'],				
			descripcion=post_data['descripcion']
		)
		session.add(proyecto)
		return {'success' : True}

	return {'failure' : True}  
	

@view_config(route_name='listar_proyecto', renderer='json')
def listar_proyecto_view(request):	
	lista_proyecto =	Proyecto.get_all_proyecto()
	vector_diccionario_proyectos = []
	for proyecto in lista_proyecto:
		diccionario_proyecto = {
			'id_proyecto': proyecto.id_proyecto,			
			'nombre': proyecto.nombre,
			'descripcion': proyecto.descripcion,

		}
		vector_diccionario_proyectos.append(diccionario_proyecto)
	
	root={'success:':True, 'proyectos': vector_diccionario_proyectos}

	return root      


@view_config(route_name='eliminar_proyecto', renderer='json')
def eliminar_proyecto_view(request):
	print "\n"
	print "\n"
	post_data = request.POST
	
	print post_data['id_proyecto']
	Proyecto.eliminar_proyecto(post_data['id_proyecto'])		
	print "\n"
	print "entre al eliminar"
	return {'success:':True}	

@view_config(route_name='modificar_proyecto', renderer='json')
def modificar_proyecto_view(request):
	post_data = request.POST
	
	Proyecto.modificar_proyecto(post_data['id_proyecto'], post_data['nombre'], post_data['descripcion'])
	
	
	return {'success':True}



#################################################################################
#############################   Tipo Item  ######################################
#################################################################################
#@view_config(permission='view', route_name='tipo_item', renderer='templates/tipo_item.pt')
#def tipo_item_view(request):
#	logged_in = authenticated_userid(request)
#	return {
#		"logged_in":logged_in,
#	}	
#    
#    
#@view_config(route_name='registrar_tipo_item', renderer='templates/add_tipo_item.pt')
#def registrar_tipo_item_view(request):
#	logged_in = authenticated_userid(request)
#	return {
#		"logged_in":logged_in,
#	}		


#@view_config(route_name='add_tipo_item', renderer='json')
#def add_tipo_item_view(request):
#	post_data = request.POST
#	
#		if 'submit' in post_data:
#		session = DBSession()
#		tipo_item = TipoItem(
#			nombre=post_data['nombre'],				
#			descripcion=post_data['descripcion'],
#		)
#		session.add(tipo_item)
#		return {'success' : True}

#	return {'failure' : True}  
#	

#@view_config(route_name='consulta_tipo_item', renderer='json')
#def consulta_tipo_item_view(request):	
#	lista_tipo_item =	TipoItem.get_all_tipo_item()
#	v_diccionario = []
#	for tipo_item in lista_tipo_item:
#		diccionario_tipo_item = {
#			'id_tipo_item': tipo_item.id_tipo_item,			
#			'nombre': tipo_item.nombre,
#			'descripcion': tipo_item.descripcion
#		}
#		v_diccionario.append(diccionario_tipo_item)
#	
#	root={'success:':True, 'tipo_items': v_diccionario}

#	return root      

#@view_config(route_name='delete_tipo_item', renderer='json')
#def delete_tipo_item_view(request):
#	print "\n"
#	print "\n"
#	post_data = request.POST
#	
#	print post_data['id_tipo_item']
#	TipoItem.eliminar_tipo_item(post_data['id_tipo_item'])		
#	print "\n"
#	print "entre al eliminar"
#	return {'success:':True}	

#@view_config(route_name='modificar_tipo_item', renderer='json')
#def modificar_tipo_item_view(request):
#	post_data = request.POST
#	a = post_data['id_tipo_item']
#	b = post_data['nombre']
#	c = post_data['descripcion']
#	
#	TipoItem.modificar_tipo_item(a, b, c)
#	
#	
#	return {'success':True}

